﻿using System;
using System.IO;
using System.Text;
using System.Windows;
using System.Xml;
using Microsoft.Win32;

namespace SHomeWorkshop.LunarPresentation.Commands
{
    public partial class Command
    {
        public static bool SaveFile()
        {
            if (Globals.selectedEditor == null)
            {
                System.Windows.MessageBox.Show("当前没有文档可以保存！",
                    Globals.appName, MessageBoxButton.OK, MessageBoxImage.Warning);
                return false;
            }

            Editor editor = Globals.selectedEditor;
            return SaveFile(editor);
        }

        /// <summary>
        /// 在调用“另存为”时，如果发现给文档的文件名与当前打开的另一个文档重复，
        /// 可以控制是否在保存后立即关闭。
        /// </summary>
        /// <param name="editor"></param>
        /// <param name="closeIfHasSameFilename">这个参数只在调用“另存为”时才有用处。
        /// </param>
        /// <returns></returns>
        public static bool SaveFile(Editor editor, bool closeIfHasSameFilename = true)
        {
            if (editor.IsReadOnly)
            {
                System.Windows.MessageBox.Show("当前文档是只读文档，不能保存！您可以使用“另存为”功能保存一个副本。",
                    Globals.appName, MessageBoxButton.OK, MessageBoxImage.Warning);
                return false;
            }

            if (editor.FileName != null)
            {
                if (editor.IsModified == false) return true;// 未修改文档。直接返回真，没必要保存。

                if (File.Exists(editor.FileName))
                {
                    FileAttributes fileAttributes = File.GetAttributes(editor.FileName);
                    if (fileAttributes == FileAttributes.ReadOnly)
                    {
                        System.Windows.MessageBox.Show("目标磁盘文档具有“只读”属性，无法写入！",
                            Globals.appName, MessageBoxButton.OK, MessageBoxImage.Warning);
                        return false;
                    }

                    //已确定存在文件名。
                }
                else//不存在对应磁盘文档。
                {
                    //SaveFileDialog sfd = new SaveFileDialog();
                    //sfd.Title = Globals.appName + "——保存文件：";
                    //sfd.Filter = Globals.appName + " 文档(*.lpdoc)|*.lpdoc";

                    //Globals.SwitchInputMethod(true);
                    //if (sfd.ShowDialog() != DialogResult.OK)
                    //{
                    //    return false;
                    //}
                    //else
                    //{
                    //    editor.FileName = sfd.FileName;
                    //}
                    System.Windows.MessageBox.Show("发生意外情况：找不到当前文档在磁盘上的对应文件！",
                        Globals.appName, MessageBoxButton.OK, MessageBoxImage.Error);
                    Globals.SwitchInputMethod(false);
                    return false;
                }
            }
            else // 文件名为null。
            {
                // 即使没有修改，也可以“另存为”。
                return Command.SaveFileAs(editor);
            }

            try
            {
                // 写到磁盘文档。

                if (editor.FileName.EndsWith(".png"))
                {
                    Command.OutportExpressionToImage(editor.RootPanel, null, editor.FileName);
                    editor.IsModified = false;
                    return true;
                }
                else if (editor.FileName.EndsWith(".lptemp"))
                {
                    return SaveTemplateDocument(editor, editor.FileName);
                }

                using (XmlTextWriter xw
                    = new System.Xml.XmlTextWriter(editor.FileName, Encoding.UTF8))
                {
                    xw.Formatting = Formatting.Indented;
                    editor.XmlDocument.WriteTo(xw);
                }

                editor.IsModified = false;
                editor.ModifingsList.PointOfSaving = editor.ModifingsList.Point;
                return true;
            }
            catch (Exception e)
            {
                Dialogs.LunarMsgBox.MsgBoxShow(
                    Globals.appName,
                    "保存文件时发生意外错误。",
                    "错误信息如下：\r\n" + e.Message,
                    e.StackTrace, MessageBoxButton.OK, MessageBoxImage.Warning);
                return false;
            }
        }

        /// <summary>
        /// 打开模板位置选取对话框，取出模板文件位置。
        /// </summary>
        /// <returns></returns>
        public static bool SaveTemplateDocument()
        {
            if (Directory.Exists(Globals.pathOfUserTemplateDocuments) == false)
            {
                Directory.CreateDirectory(Globals.pathOfUserTemplateDocuments);
            }

            if (Globals.selectedEditor == null)
            {
                System.Windows.MessageBox.Show("当前没有打开任何文档！", Globals.appName,
                    MessageBoxButton.OK, MessageBoxImage.Warning);
                return false;
            }
            else
            {
                //如果本身就是模板，则此功能与“保存”相同——不弹出任何对话框。
                if (Globals.selectedEditor.FileName != null)
                {
                    if (Globals.selectedEditor.FileName.EndsWith(".lptemp") &&
                        Globals.selectedEditor.FileName.StartsWith(Globals.pathOfUserTemplateDocuments))
                    {
                        return Command.SaveFile();
                    }
                }

                SaveFileDialog sfd = new SaveFileDialog();
                sfd.Title = Globals.appName + "——保存模板文件：";
                sfd.Filter = Globals.appName + " 模板文档(*.lptemp)|*.lptemp";
                sfd.FileName = Globals.selectedEditor.FileNameHeader.Text;
                sfd.InitialDirectory = Globals.pathOfUserTemplateDocuments;

                string defFileName = Globals.selectedEditor.FileNameHeader.Text;

                if (defFileName.EndsWith(".lpdoc"))
                {
                    defFileName = defFileName.Substring(0, defFileName.Length - 6);
                }

                sfd.FileName = defFileName;

                defFileName = GetDefFileNameOfEditor(Globals.selectedEditor);

                if (defFileName != "")
                {
                    if (defFileName.EndsWith(".lpdoc"))
                    {
                        defFileName = defFileName.Substring(0, defFileName.Length - 6);
                    }

                    sfd.FileName = defFileName;
                }

                try
                {
                    if (sfd.ShowDialog() == true)
                    {
                        if (SaveFileAs(Globals.selectedEditor, true, sfd.FileName))
                        {
                            Globals.selectedEditor.FileName = sfd.FileName;

                            //看是否保存在模板库中。
                            if (sfd.FileName.StartsWith(Globals.pathOfUserTemplateDocuments) == false)
                            {
                                System.Windows.MessageBox.Show("您在保存此模板文档时，选取的目标位置不在指定的用户数据目录中的“模板”子目录下，" +
                                    "“新建”文档时将不能使用此模板！如果要使用此模板来新建文档，请将此模板文件移动到用户数据目录下的“模板”子目录下", Globals.appName,
                                    MessageBoxButton.OK, MessageBoxImage.Warning);
                            }

                            return true;
                        }
                    }

                    return false;
                }
                finally
                {
                    // 为防止主窗口快捷键失效，令Editor的ScrollViewer获取焦点。
                    Globals.MainWindow.Focus();
                    Globals.SwitchInputMethod(false);
                }
            }
        }
    }
}
